Вот, я прикрепил карту-пример. Вам нужно только подставить нужные имена. Я не проверял, но сложного ничего нет, поэтому всё должно работать нормально.
+
Только уберите событие в триггере Check Players, а то он сработает дважды, т. к. я его запускаю в стандартном триггере инициализации.
DracoL1ch, + у разных игроков один и тот же объект имеет разные координаты
надо синхронизировать координаты камеры игроков между всеми игроками и создавать эффекты для всех игроков
вот статья
Стремись к использованию одного единственного таймера(по крайней мере это пропагандируется с давних пор. конкретных чисел по производительности дать не могу). Каждый тик таймера увеличиваешь целочисленные переменные, выделенные по одной для каждого игрока. По событию отданного приказа обнуляешь эти переменные. Если переменная > скольки-то, предлагаешь прописать сообщение в чат для кика. Правда в дотке там таймер по получению опыта вроде.
Darknessay, я имел ввиду изначальное расстояние между объектами.
Вот нарисовал схематично.
Обозначим расстояние которое прошёл 1 юнит за х. Красная линия это путь который прошел юнит 2 до встречи. Двигались они одинаковое время, значит составим равенство(s1 и s2 это скорости) и немного преобразуем.
Вод мою систему такой расчет не подойдет. GF RaiseD:
Это не в одну строку посчитать
function getTargetOffset takes unit Caster, unit Target, real targetSpeed, real missileSpeed returns real
local real x1 = GetUnitX(Caster)
local real x2 = GetUnitX(Target)
local real x3
local real X4 //Координата X точки пересечения
local real y1 = GetUnitY(Caster)
local real y2 = GetUnitY(Target)
local real y3
local realY4 //Координата Y точки пересечения
local real targetSpeed
local real missileSpeed
local real distancex1x2 = Sqrt(Pow(x2-x1,2)+Pow(y2-y1,2))
local real distancex1x3
local real distanceX4Y4
set x3 = GetUnitX(Target)+targetSpeed*distaancex1x2/missileSpeed*Cos(GetUnitFacing(Target))*bj_DEGSTORAD
set y3 = GetUnitY(Target)+targetSpeed*distaancex1x2/missileSpeed*Sin(GetUnitFacing(Target))*bj_DEGSTORAD
set distaancex1x3 = Sqrt(Pow(x3-x1,2)+Pow(y3-y1,2))
set X4 = GetUnitX(Target)+targetSpeed*distancex1x2/missileSpeed*distancex1x3/distancex1x2*Cos(GetUnitFacing(Target))*bj_DEGSTORAD
set Y4 = GetUnitY(Target)+targetSpeed*distancex1x2/missileSpeed*distancex1x3/distancex1x2*Sin(GetUnitFacing(Target))*bj_DEGSTORAD
set Caster = null
set Target = null
set distanceX4Y4 = Sqrt(Pow(X4-x2,2)+PowY4-y2,2)) // Опережение (по отношению к повороту юнита-цели)
return distanceX4Y4
endfunction
Если что - я не проверял. Но должно бы работать.
Если тебе нужен угол с точки x2 на точку x3, определяется он так:
Atan2(y3-y2,x3-x2)*bj_RADTODEG
Убрал синтаксические ошибки, немного "допилил" - не хочет работать.
Всем привет работяги, я сам справился. Проверил: всё работает.
//===============Вспомогательные_функции================
function GetAngleXY takes real x, real y, real xx, real yy returns real
return bj_RADTODEG * Atan2(yy - y, xx - x)
endfunction
function GetDisXY takes real x, real y, real xx, real yy returns real
return SquareRoot((xx-x) * (xx-x) + (yy-y) * (yy-y))
endfunction
function GetPolarX takes real x, real f, real d returns real
return x + Cos(f*0.0174)*d
endfunction
function GetPolarY takes real y, real f, real d returns real
return y + Sin(f*0.0174)*d
endfunction
//=======================Основная часть=======================
function GetTargetOffset takes unit host, unit target, real speedm returns real
local real speedt = GetUnitMoveSpeed(target)
local real x = GetUnitX(host)
local real y = GetUnitY(host)
local real xx = GetUnitX(target)
local real yy = GetUnitY(target)
local real fac = GetUnitFacing(target)
local real dis = GetDisXY(x,y,xx,yy)
local real time = dis/speedm
local real dispost = GetDisXY(xx,yy,GetPolarX(xx,fac,time*speedt),GetPolarY(yy,fac,time*speedt))
local real X = GetPolarX(xx,fac,dispost) //нужные координаты цели
local real Y = GetPolarY(yy,fac,dispost)
return GetAngleXY(x,y,X,Y)//возвращает угол который нужен для корректировки стрельбы
endfunction
native UnitAlive takes unit id returns boolean
function CountAliveUnitsInGroupEnum takes nothing returns nothing
if UnitAlive(GetEnumUnit()) then
set bj_groupCountUnits = bj_groupCountUnits + 1
endif
endfunction
function CreateUnitsForPlayer takes player p returns nothing
local integer first = 1 //первый элемент массива
local integer last = 3 //последний элемент
local integer random = GetRandomInt(first, last) //случайное число от первого элемента до последнего, т.е. от 1 до 3
local integer units_index = GetRandomInt(1, 3) //случайное число от 1 до 3
local group g = CreateGroup() //создаем группу
local integer i = random //счетчик цикла
loop
call GroupEnumUnitsInRect(g, udg_locations[i], null) //добавляем в группу всех юнитов из области
set bj_groupCountUnits = 0 //обнуляем счетчик
call ForGroup(g, function CountAliveUnitsInGroupEnum) // считаем юнитов в группе
if bj_groupCountUnits == 0 then //проверяем сколько вышло
call CreateUnit(p, udg_buildings[units_index], GetRectCenterX(udg_locations[i]), GetRectCenterY(udg_locations[i]), 270.)
call CreateUnit(p, udg_units[units_index], GetRectCenterX(udg_locations[i]), GetRectCenterY(udg_locations[i]), 0.)
call CreateUnit(p, udg_units[units_index], GetRectCenterX(udg_locations[i]), GetRectCenterY(udg_locations[i]), 0.)
call CreateUnit(p, udg_units[units_index], GetRectCenterX(udg_locations[i]), GetRectCenterY(udg_locations[i]), 0.)
call CreateUnit(p, udg_units[units_index], GetRectCenterX(udg_locations[i]), GetRectCenterY(udg_locations[i]), 0.)
exitwhen true
else // если юнитов больше 0, тогда
call GroupClear(g) // очищаем группу
endif
set i = i + 1
if i > last then
set i = first
endif
exitwhen i == random
endloop
//избавляемся от утечек
call GroupClear(g)
call DestroyGroup(g)
set g = null
endfunction
PhysCraft, читал, там очень мало написано, и совсем не то что я ожидал. В принципе я вроде смог прописать путь по папкам, сделал что бы играла музыка, в игре модели видно, но в редакторе нет, и как я теперь буду в редакторе ландить? Мне импорт для ландшафта нужен. Есть какой-то способ в редакторе тоже видеть?
Тут сможет помочь только "мемхак", который выполнит загрузку необходимых файлов и по свей сути выполнит работу трояна. В остальном автоматически без хостбота этого сделать нельзя.
"В личном порядке".
Занесена базовая атака героя, учтено, сколько книжек на урон герой "съел", какие способности изучил, какие предметы одел, в идеале - какие баффы какого уровня получил. Хотя скорее всего описание врёт и сделано всё попроще - от главного атрибута или типа того, чтобы примерно равнялось 50% атаки. Если нужен костыль такого заклинания - могу скинуть, но надёжность оставляет желать лучшего. Но в наработке исправно наносится в заклинании урон по величине атаки героя, правда без учета баффов и преметов, только уровня. Farrien:
У меня появилась идея,
Если нужно -могу подогнать системку, ловящую перехват смены приказа, она не блещет точностью, но абузить шансовые эффекты точно не получится.
Если мне память не изменяет, то в вк3 можно сделать либо синфазный партикль, либо XY партикль. Последний делается проставлением галочки в соответствующей колонке в магосе (модел эдиторе)
Если XY неподходит, то есть смысл подумать над тем, как-бы сделать такой эффект мешем.
не очень понимаю "Zap'ов", напишите подробно пожалуйста
Он имеет ввиду молнии, как я понимаю. Те, которые используют текстуру zap что-то там .blp
Интересно посмотреть над чем ты там работаешь кстати!
Советую проверять бекапы один за другим, и в том, в котором впервые возникает такая проблема, и искать ошибку, она наверняка где-то в изменениях относительно хронологически предыдущей версии.
Чтобы иметь и модель с обычной текстурой и с другой, с помощью программы для извлечения моделей из Warcraft 3 (я пользуюсь обычно Warcraft 3 Viewer, поищи на сайте), там ищешь справа в папках твою модель, извлекаешь её к себе на компьютер.
Потом открываешь программой mdlvis (основная программа для моделлинга, тоже здесь есть) модель, сразу выделяешь её и нажимаешь кнопку UV-карты или модули - редактор текстур.
Внизу есть путь для текстуры, измени на название скачанной. Нажми enter, сохрани модель.
Если текстура специально для той модели, переходи к следующему пункту.
Кинь текстуру и модель в папку с вариком и открывай WE. У тебя стандартная модель и модель с другой текстурой.
Возможно, звучит сложно, но я привык, несколько кликов - и текстура изменена.
Darknessay, я имел ввиду изначальное расстояние между объектами.
Вот нарисовал схематично.
Обозначим расстояние которое прошёл 1 юнит за х. Красная линия это путь который прошел юнит 2 до встречи. Двигались они одинаковое время, значит составим равенство(s1 и s2 это скорости) и немного преобразуем.
Вод мою систему такой расчет не подойдет. GF RaiseD:
Это не в одну строку посчитать
function getTargetOffset takes unit Caster, unit Target, real targetSpeed, real missileSpeed returns real
local real x1 = GetUnitX(Caster)
local real x2 = GetUnitX(Target)
local real x3
local real X4 //Координата X точки пересечения
local real y1 = GetUnitY(Caster)
local real y2 = GetUnitY(Target)
local real y3
local realY4 //Координата Y точки пересечения
local real targetSpeed
local real missileSpeed
local real distancex1x2 = Sqrt(Pow(x2-x1,2)+Pow(y2-y1,2))
local real distancex1x3
local real distanceX4Y4
set x3 = GetUnitX(Target)+targetSpeed*distaancex1x2/missileSpeed*Cos(GetUnitFacing(Target))*bj_DEGSTORAD
set y3 = GetUnitY(Target)+targetSpeed*distaancex1x2/missileSpeed*Sin(GetUnitFacing(Target))*bj_DEGSTORAD
set distaancex1x3 = Sqrt(Pow(x3-x1,2)+Pow(y3-y1,2))
set X4 = GetUnitX(Target)+targetSpeed*distancex1x2/missileSpeed*distancex1x3/distancex1x2*Cos(GetUnitFacing(Target))*bj_DEGSTORAD
set Y4 = GetUnitY(Target)+targetSpeed*distancex1x2/missileSpeed*distancex1x3/distancex1x2*Sin(GetUnitFacing(Target))*bj_DEGSTORAD
set Caster = null
set Target = null
set distanceX4Y4 = Sqrt(Pow(X4-x2,2)+PowY4-y2,2)) // Опережение (по отношению к повороту юнита-цели)
return distanceX4Y4
endfunction
Если что - я не проверял. Но должно бы работать.
Если тебе нужен угол с точки x2 на точку x3, определяется он так:
Atan2(y3-y2,x3-x2)*bj_RADTODEG
Убрал синтаксические ошибки, немного "допилил" - не хочет работать.
Всем привет работяги, я сам справился. Проверил: всё работает.
//===============Вспомогательные_функции================
function GetAngleXY takes real x, real y, real xx, real yy returns real
return bj_RADTODEG * Atan2(yy - y, xx - x)
endfunction
function GetDisXY takes real x, real y, real xx, real yy returns real
return SquareRoot((xx-x) * (xx-x) + (yy-y) * (yy-y))
endfunction
function GetPolarX takes real x, real f, real d returns real
return x + Cos(f*0.0174)*d
endfunction
function GetPolarY takes real y, real f, real d returns real
return y + Sin(f*0.0174)*d
endfunction
//=======================Основная часть=======================
function GetTargetOffset takes unit host, unit target, real speedm returns real
local real speedt = GetUnitMoveSpeed(target)
local real x = GetUnitX(host)
local real y = GetUnitY(host)
local real xx = GetUnitX(target)
local real yy = GetUnitY(target)
local real fac = GetUnitFacing(target)
local real dis = GetDisXY(x,y,xx,yy)
local real time = dis/speedm
local real dispost = GetDisXY(xx,yy,GetPolarX(xx,fac,time*speedt),GetPolarY(yy,fac,time*speedt))
local real X = GetPolarX(xx,fac,dispost) //нужные координаты цели
local real Y = GetPolarY(yy,fac,dispost)
return GetAngleXY(x,y,X,Y)//возвращает угол который нужен для корректировки стрельбы
endfunction
баф у ауры убрать нельзя
ибо именно баф даёт все бонусы ауры
для теста можешь триггерно удалять ауру и баф с юнита
бонус от ауры тут же исчезнет
а если не удалять баф то он повесит пару секунд давая бонус
лучше всего это видно на доспехах веры
так что пиши свою ауру
на основе таймера с периодом в 1 секунду и перебором всех юнитов на расстоянии R от владельца ауры и добавлении им бонусов
а так же удалением бонусов у отошедших юнитов
unsinkable78, один из вариантов это большое количество однотипных триггеров с периодом
объедении их в 1
а лучше используй таймер вместо триггеров unsinkable78, так же вероятно проблема в твоих массивах
ты судя по всему задаёшь им размер в 1000
из за чего при запуске игры твой массив заполняется ненужными значениями что забивает память и может приводить к лимиту потока (в вар3 у потока/триггера есть максимальное количество операций которые он может выполнить)
вот пример из твоего j файла
set i = 0
loop
exitwhen (i > 1000)
set udg_squad[i] = CreateGroup()
set i = i + 1
endloop
этот код циклом от 0 до 1000 создаёт группы(1000 групп соответственно) и заносит их в массив squad
это тратит более 1000 операций
и таких моментов много
так же я видел места где ты использовал массивы вместо обычных переменных что тоже увеличивает затраты ресурсов и может приводить к лимиту потока
массивы нужно использовать лишь там где без них не обойтись
Maxsavin, я каждой карте из кампаний даю свой кэш, чтобы не перепуталось ничего.
Не знаю, что получилось бы, сделай я один кэш-файл на всю кампу и грузи карты потом не по порядку. Проверять не буду. Кампания - это пак карт.
Всё, я разобрался. Там дело было в том, что герой на арене был раньше нейтральным, а потом при выборе менял владельца. А магазин никак не реагировал на это и думал, что перед ним всё ещё нейтрал. Решил проблему, перенеся выбор героев подальше от магазинов.
IssueImmediateOrder(caster, "howlofterror")
caster = юнит, которому ты хочешь отдать приказ
Ну или, раз ты id нашел:
IssueImmediateOrderById(caster, 852588)
Если значение меньше 0 хоть на .01 то твой герой или б.е. будет неуязвима. Это внутренний баг игры.
Хотя в этой фишке бессмертия есть и свои плюсы. Однако будет восполнять хп от этого процента, если по воину бьют магической атакой, или же при получении им урона от заклинания, которое наносит маг. урон.
Если хотите просто уменьшать наносимый урон, то делать лучше это через триггер.
Так же можешь в сокрытой способности на основе книга заклинаний делать блок урон на основе доспехи гор... Др. вариантов много...
должен сразу предупредить что делать за тебя никто не будет
теперь по твоим вопросам
чтобы нельзя было кликать скрываешь, даёшь москиты, делаешь видимым
действие проиграть звук и указываешь твою фразу
выбираем всех подходящих(враги,живые) юнитов в радиусе от точки каста и создаём по дамми юниту(юнит без модели, без атаки, с москитами, с нужной способность, время жизни юнита 1 сек) для каждого подходящего юнита приказывая дамми юниту применить нужную способность в подходящего юнита
таким образом каждый дамми юнит применит нужную способность (в твоём случае корни) в 1 подходящего юнита для которого он и был создан а потом исчезнет
что мешает юзнуть берсерк, манащит, канал, да хоть виндвалк?
Мешает то, что берсерк и виндвалк уже использованы, переключаемые абилки - хурма, а канал не моментальный.
Ты станишь юнита, какая тебе разница?
Канал пойдет с тем же успехом, юнит его кастанет в любом случае.
Переключаемые абилки работают нормально, если уметь немного искать и читать, как их юзать в качестве простых есть инфа в статьях на форуме.
Еще всякие вееры ножей, не сбивают приказ идти куда либо. Юзай его в качестве основы.
м, тебе надо выбирать по одному из группы?
я делал так: f - юнит gd-группа
loop
set f = FirstOfGroup(gd)
exitwhen f == null
call UnitDamageTarget(GetTriggerUnit(),f, damage, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\AnimateDead\\AnimateDeadTarget.mdl",f,"origin"))
call GroupRemoveUnit(gd, f)
endloop
Сначала он выбирает первого юнита группы, делает с ним действия(в моем случае дамажит + эффект кладет), удаляет из группы. И как только юниты кончатся цикл брякается.
Sargaraser, эт проблема сиденья с телефона -'фиг попадешь по нужной ссылке
А по теме поиск творит чудеса , за 3 минуты поиска нашел 10 тем с таким вопросом и в каждой есть решение
Событие каждые 1 сек времени
пауза triggering unit
^ Не имеет смысла, здесь нет triggering unit, исправляй, сообщи об изменениях или неизменениях.
У тя там чета про убийства ещё, но спрятать юнит проиграв анимацию смерти не означает его убийство и из группы он не удаляется, если состоит. Так что имей в виду.
не знаю даже поищи СТАРЕЙШИХ ИГРОКОВ У ВАРКРАФТА и попроси у них все карты которые они имеют
а дальше пороверь все карты и найди её если не найдёш значит она тебе приснилась)
Уровень = Уровню героя. Характеристики = Характеристикам героя. Цикл 6-разовый на каждый слот дающий предмет герою. Уровни способностей равные уровню способностей героя. Героя, в смысле твоего героя. Ну еще создать юнита типа твоего героя. Что-то еще? Если он где-то в переменных для пассивок, то с ними тоже по колдовать и все.
Будет только одна проблема, если ты книги атаки на его юзал то их никак не засеч без геморроя. А так все в виде целочисленных на твоем герое записано.
Увы нет, смотреть из за чего ошибка и потом смотреть что в коде могло её вызвать.
Так же нелишним будет собрать статистику а что именно происходило в этот момент и изучать код, кторый работал в этот момент.
Фаталить могут даже дефолтные способности.
Момент с порчей и миникартой оказался тем что там высота на уровне воды.
Но саму тень я все равно не могу убрать.
А все вопрос снимаю, это тень от здания
м, тебе надо выбирать по одному из группы?
я делал так: f - юнит gd-группа
loop
set f = FirstOfGroup(gd)
exitwhen f == null
call UnitDamageTarget(GetTriggerUnit(),f, damage, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\AnimateDead\\AnimateDeadTarget.mdl",f,"origin"))
call GroupRemoveUnit(gd, f)
endloop
Сначала он выбирает первого юнита группы, делает с ним действия(в моем случае дамажит + эффект кладет), удаляет из группы. И как только юниты кончатся цикл брякается.
Параметры стака ядов с одним и тем же баффом, это нужно чтобы складывались замедлени и\или урон от разных юнитов, или бафф тупо обновлялся.
С одним из параметров яды с разными баффами скатаются независимо, каждый вешает свой бафф. (годная основа для замедляющих способностей)
А игра вылетает из за зацикливания, темболее бафф при удалении и появлении наносит 0.00 ед урона, это так для справки.
Ни разу не делал карты "чисто стандартного жанра". Т.е. общий жанр определить можно всегда, но нужно чтобы можно было выделить что-то, чем твоя карта реально отличается от себе подобных.
Вот, глянь чуть (щас набегут хомячки с возгласами ОЛОЛО РЕКЛАМА ДОК БЛИН КАК НЕ СТЫДНА)
Немного добавлю.. Tag (Tag Map) - Особенный жанр карт, в котором существует две команды - убегающие и догоняющие. Убегающие должны бежать от догоняющих, при этом они могут строить защитные базы, чтобы избежать поимки. Если убегающие выживут на протяжении заданного времени, то они выигрывают. Если догоняющие убивают всех убегающих до истечения времени, побеждают они. Выбывшие убегающие обычно помечаются как флаги или чёрные энты и воскрешаются, если они были атакованы или один из других убегающих достиг центра карты.
Примеры карт: Петросянщина, Вампиризм, Маньяк с пилой
Mini-Game - Жанр, включающий в себя карты обычно маленьких размеров и узконаправленные. Есть сборники мини-игр, которые включают в себя сразу несколько маленьких игрушек различного жанра. По своему устройству обычно несложные.
Примеры карт: Worm War, Death Sheep, Azeroth Grand Prix
Simulator - Не особо распространённый жанр карт, который содержит детализированное управление какой-либо аспектом карты. Его порой нетрудно спутать с RPG, но есть свои отличия.
Примеры карт: Ashenvale Archers, Fantasy Life, Jungle Trolls Reborn
Cinematic - Постановочные ролики, видео. Может даже и мини-фильмы.
Примеры карт: DDay:Judgement the Movie, matso TROY
Hero Arena - игроки выбирают по одному герою и помещаются на арену. Цель в отличие от AOS исключительно в убийстве героев вражеских игроков, а не уничтожении Базы врага.
Примеры карт: Angel arena
Сastle defense - игроки должны защищать определенное здание в течение определенного времени или количества волн монстров.
Примеры карт: X Hero Siege, Castle Fight, Lotr Lord of the Rings Castle Wars
Можно также делить общие жанры на категории: например:
Gerych, сюда тоже можно но вопрос будет закрыт через неделю с момента последнего ответа
ну а вообще для таких вещей стоит создать бложик и там в качестве ресурса подобное спрашивать
Smart096, баг только в этой карте?
в новых картах бага нету?
если да то стоит проверить импортируемые модели и текстуры (мб часть битая)
но с вероятностью в 60% проблема в системе ибо было много жалоб на баги в вин10
Параметры стака ядов с одним и тем же баффом, это нужно чтобы складывались замедлени и\или урон от разных юнитов, или бафф тупо обновлялся.
С одним из параметров яды с разными баффами скатаются независимо, каждый вешает свой бафф. (годная основа для замедляющих способностей)
А игра вылетает из за зацикливания, темболее бафф при удалении и появлении наносит 0.00 ед урона, это так для справки.
» WarCraft 3 / Выбор расс
» WarCraft 3 / Кик игрока
» WarCraft 3 / Стрельба двумя снарядами
» WarCraft 3 / Случайное число
» WarCraft 3 / Как отключить получение опыта?
» WarCraft 3 / .mix архивы
» WarCraft 3 / Авто атака
» WarCraft 3 / Вопрос с камерой
» WarCraft 3 / Как наложить текстуру на модель?
» WarCraft 3 / Элементарное!
» WarCraft 3 / Почему не работает предмет?
» WarCraft 3 / Леденящий крик
» WarCraft 3 / Очищается группа
» WarCraft 3 / Стан в неуязвимость
» WarCraft 3 / Юнит в группе
» WarCraft 3 / Старая карта в варике
» WarCraft 3 / Warcraft 3: 1.28+
» WarCraft 3 / Проблема с работой библиотеки
» WarCraft 3 / Убрать тень
» WarCraft 3 / Выбран юнит
» WarCraft 3 / Жанр карты
» WarCraft 3 / Текст при загрузке карты
» WarCraft 3 / Урон 0